Softmax的二三事
Softmax 介绍
多分类是机器学习中一类非常常见的任务,比如将0~9某个字写到图片上,使用多分类的方法来识别这个图片上写的到底是几(MNIST手写体识别
),对于多分类任务常用的机器学习方法有:
- 借助
二分类
,使用One vs All或者One vs One来完成多分类 - 使用朴素贝叶斯来完成多分类
- 决策树类模型~
- 最大熵模型
- 。。。
同时本文要说到的Softmax
是一个是Logistic
模型上的一个扩展,可以轻松的完成多分类任务,它是一个有监督的学习,不过可以和相当热门的神经网络可以轻松结合起来.
Logistic回顾
Logistic
模型是一个非常基础而又高效的二分类
模型,并且由于其最终值会归一化到0~1,因此也很多场景下也会作为回归
模型使用,比如ctr预估
。Logistic
的输入数据是
$$\{(x^1,y^1),(x^2,y^2)…(x^m,y^m)\}$$
其中$x^i$为输入的特征向量,$y^i$即为要训练的目标,在二分类
中,一般$y^i \in \{0,1\}$,则Logistic
的算分函数为
$$h_{\theta}(x) = \frac{1}{1+e^{-\theta^Tx}}$$
使用最大似然法进行参数估计,其似然函数为
$$\prod h_{\theta}(x^i)^{y^i} \times (1-h_{\theta}(x^i))^{(1-y^i)}$$
对其进行负的对数转换之后则最终的损失函数为
$$ J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left [ y^i \text{log}h_{\theta}(x^i) + (1-y^i)\text{log}(1-h_{\theta}(x^i)) \right ] $$
在Logistic
模型中我们可以发现我们最终需要求的是$\theta$向量.
Softmax 模型
在Softmax
模型中,其输入也是类似向量的设计
$$\{(x^1,y^1),(x^2,y^2)…(x^m,y^m)\}$$
只是这个的$y^i \in \{1,2,…k\}$有$k$个类别,而最终要求的应该是这个值
$$P(y=k_j | x)$$
也就是类别$k_j$可能的概率,也就是会形成一个$k$维的输出
$$
h_{\theta}(x^i)=\begin{bmatrix} P(y^i=1|\theta_1,x_i)
\\ P(y^i=2|\theta_2,x_i)
\\ …
\\ P(y^i=k|\theta_k,x_i)
\end{bmatrix}
=
\frac{1}{\sum_{s=1}^k e^{\theta_s^Tx_i}}
\begin{bmatrix} e^{\theta_1^Tx_i}
\\ e^{\theta_2^Tx_i}
\\ …
\\ e^{\theta_k^Tx_i}
\end{bmatrix}
$$
则我们整个模型最终要求的是一个$\theta$矩阵
(注意,在Logistic
中求是一个向量),矩阵的每一行$\theta_i$其实就是与输入参数$x$相乘的向量~
注意:分子$\frac{1}{\sum_{s=1}^k e^{\theta_s^Tx_i}}$是为了让最终所有类别的概率之和为
1
每个类别j的概率为:
$$p_j=\frac{e^{\theta_j^Tx}}{\sum_{s=1}^k e^{\theta_s^Tx}}$$
Softmax的损失函数
同样,Softmax
使用最大似然法进行参数的估计,则似然函数为
$$\prod_i^m \prod_{j=1}^k p_j^{I\{y^i = k_j\}}$$
其中$I\{y^i = k_j\}$为二值函数,当且仅当$y^i == k_j$时为1,否则为0
对其取负的对数
可以得到其损失函数:
$$J(\theta) = -\frac{1}{m} \left[ \sum_{i=1}^m \sum_{j=1}^k I\{y^i = k_j\} \text{log} p_j \right]$$
假设我们使用梯度下降法对损失函数进行优化,因此对$\theta$进行求导,在求导之前先算下面这个:
$$ \frac{\delta p_j}{\delta \theta_i}=\left\{
\begin{aligned}
\frac{\frac{e^{\theta_j^Tx}}{\delta \theta_{\color{Red} j}}\sum_{s=1}^k e^{\theta_s^Tx}-\frac{\sum_{s=1}^k e^{\theta_s^Tx}}{\delta \theta_{\color{Red} j}}e^{\theta_j^Tx}}{(\sum_{s=1}^k e^{\theta_s^Tx})^2} &= x p_j(1-p_j) & \quad if i=j \\
\frac{\frac{e^{\theta_j^Tx}}{\delta \theta_{\color{Red} i}}\sum_{s=1}^k e^{\theta_s^Tx}-\frac{\sum_{s=1}^k e^{\theta_s^Tx}}{\delta \theta_{\color{Red} i}}e^{\theta_j^Tx}}{(\sum_{s=1}^k e^{\theta_s^Tx})^2} &= x p_ip_j & \quad if i \neq j\\
\end{aligned}
\right.$$
有了上面的基础之后,我们对于$J(\theta)$进行求导,就可以得到如下的梯度:
$$\begin{equation}\begin{split} \triangledown_{\theta_j}J(\theta) &= -\frac{1}{m} \left[ \sum_{i=1}^m \sum_{j=1}^k I\{y^i = k_j\} \frac{1}{p_j} \frac{\delta p_j}{\delta \theta_j } \right]\\
&= -\frac{1}{m} \left[ \sum_{i=1}^m \left ( I\{y^i = k_i\} \frac{1}{p_i} x^i p_i(1-p_i) - \sum_{j=1,j \neq i}^k I\{y^i = k_j\} \frac{1}{p_j} x^i p_i p_j \right ) \right ] \\
&= -\frac{1}{m} \left[ \sum_{i=1}^m x^i \left ( I\{y^i = k_i\} (1-p_i) - \sum_{j=1,j \neq i}^k I\{y^i = k_j\} p_i \right ) \right ] \\
&= -\frac{1}{m} \left[ \sum_{i=1}^m x^i \left ( I\{y^i = k_{\color{Red} i}\} - I\{y^i = k_i\}p_i - \sum_{j=1,j \neq i}^k I\{y^i = k_j\} p_i \right ) \right ] \\
&= -\frac{1}{m} \left[ \sum_{i=1}^m x^i \left ( I\{y^i = k_{\color{Red} j}\} - \sum_{j=1}^k I\{y^i = k_j\} p_i \right ) \right ] \\
&= -\frac{1}{m} \left[ \sum_{i=1}^m x^i \left ( I\{y^i = k_j\} - p_i \right ) \right ]
\end{split}\end{equation}$$
注意有:
- $\sum_{j=1}^k I\{y^i = k_j\} = 1 $ ,因为样本必定会落到一个类别上
- 同时上面式子里面红色的${\color{Red} j}$是因为左侧分离出来,其中分离的条件是$i=j$
上面的梯度最终将会是一个向量的形式,$\frac{\delta J(\theta)}{\delta \theta_{j,l}}$表示第$j$的类别的第$l$个特征的梯度方式,有了该梯度了之后,最终可以得到如下的参数更新:
$$\theta_j = \theta_j - \alpha \triangledown_{\theta_j}J(\theta) \quad j \in \{1,…k\}$$
到了这一步,整体看到就和二分类的Logistic
很像了,上面是使用梯度下降法的求解,当然还可以使用类似L-BFGS
算法进行优化~
另外关于其L1
和L2
的正则项也是可以参考Logistic
Softmax与Logistic的联系
在Softmax
的$k=2$时(其实就是二分类了),再来观察Softmax
的一些式子
算分函数
$$\begin{equation}\begin{split} h_\theta(x^i) &= \frac{1}{e^{\theta_1^Tx_i}+e^{\theta_2^Tx_i}}
\begin{bmatrix} e^{\theta_1^Tx_i}
\\ e^{\theta_2^Tx_i}
\end{bmatrix} \\
&= \frac{1}{e^{(\theta_1-\theta_1)^Tx_i}+e^{(\theta_2-\theta_1)^Tx_i}}
\begin{bmatrix} e^{(\theta_1-\theta_1)^Tx_i}
\\ e^{(\theta_2-\theta_1)^Tx_i}
\end{bmatrix} \\
&= \begin{bmatrix} \frac{1}{1+e^{(\theta_2-\theta_1)^Tx_i}}
\\ \frac{e^{(\theta_2-\theta_1)^Tx_i}}{1+e^{(\theta_2-\theta_1)^Tx_i}}
\end{bmatrix} \\
&= \begin{bmatrix} \frac{1}{1+e^{(\theta_2-\theta_1)^Tx_i}}
\\ 1- \frac{1}{1+e^{(\theta_2-\theta_1)^Tx_i}}
\end{bmatrix} \\
\end{split}\end{equation}$$
在上面第一到第二步减去$\theta_1$任成立的原因是,
Softmax
的参数过多,是一个大矩阵,里面存在着冗余的参数:
$$\begin{equation}\begin{split} h_{\theta_j}(x^i) &= \frac{e^{\theta_jx^i}}{\sum_{s=1}^k e^{\theta_sx^i}} \\
&= \frac{e^{(\theta_j-\phi)x^i}}{\sum_{s=1}^k e^{(\theta_s-\phi)x^i}} \\
&= \frac{e^{\theta_jx^i}e^{-\phi x^i}}{\sum_{s=1}^k e^{\theta_sx^i}e^{-\phi x^i}} \\
&= \frac{e^{\theta_jx^i}}{\sum_{s=1}^k e^{\theta_sx^i}}
\end{split}\end{equation}$$
因此,参数矩阵中减去同一个向量
并不会影响最终的优化结果~关于参数过度化问题可以参考这里
所以当$k=2$时Softmax
的算分函数其实就是Logistic
的变形~
损失函数
Softmax
的损失函数为
$$\begin{equation}\begin{split} J(\theta) &= -\frac{1}{m} \left[ \sum_{i=1}^m \sum_{j=1}^2 I\{y^i = k_j\} \text{log} p_j \right] \\
&= -\frac{1}{m} \left[ \sum_{i=1}^m I\{y^i = k_1\} \text{log} p_1 + I\{y^i = k_2\} \text{log} p_2 \right] \\
&= -\frac{1}{m} \left[ \sum_{i=1}^m I\{y^i = k_1\} \text{log} p_1 + (1-I\{y^i = k_1\}) \text{log} (1-p_1) \right] \\
\end{split}\end{equation}$$
因为:$I\{y^i = k_1\} + I\{y^i = k_2\} =1$ 以及 $p_1+p_2=1$
最终也就变成了Logistic
的损失函数形式了
总结
Softmax
模型其实是Logistic
对于多分类上面的扩展Softmax
最终产出的每一类的概率之和为1Softmax
其实并不是一个损失函数(因为看到很多文章中都会很自然的写道Softmax损失函数
),它自己求优化时还是使用者交叉熵的这一套
参考
- Softmax回归 ufldl
文本大致组织按这个参考来的,因为它写的实在太好了,自己在造一遍轮子,以便记忆^_^
- Derivative of Softmax loss function
本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言。